//
// Created by DengLibin on 2018/12/13 0013.
//

#include <string>
#include <vector>
#include <list>
#include <set>
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
//函数对象:即一个重载了括号操作符“（）”的对象。当用该对象调用此操作符时，其表现形式如同普通函数调用一般，因此取名叫函数对象
//函数对象可以保存函数函数调用状态，如:调用一次改变某个状态的值
//函数对象(function object)又叫仿函数(functor)，就是重载了调用运算符()的类，所生成的对象，就叫做函数对象/仿函数。因为重载了()之后，
//我们就能像函数一样去使用这个类，同时类里面又可以储存一些信息，所以要比普通的函数更加灵活
template <typename T>
class ShowElement
{
public:
    T t;
    //每调用一次，t都会改变
    void operator()(T &t)
    {
        this->t = t;
        cout << t << endl;
    }
    void print()
    {
        cout << t << endl;
    }
};
void fun_obj()
{
    int a = 100;
    ShowElement<int> showElement;
    showElement(a);//形式很像普通函数的调用,
    vector<int> v;
    for (int i = 0; i < 10; i++)
    {
        v.push_back(i);
    }
    //函数对象作为参数，是值传递，不是引用传递
    for_each(v.begin(), v.end(), showElement);
    //还是100，说明函数对象做参数是值传递，实参的函数对象不会改变
    showElement.print(); //100
    //如果需要改变函数对象的状态，可以将返回值(返回值就是函数对象)赋值给该函数对象
    showElement = for_each(v.begin(), v.end(), showElement);
    showElement.print(); //9
}

int main30()
{
    fun_obj();
    return 0;
}